﻿using System;
using System.Web.Mvc;

namespace ContactMvc4TB.Helpers.MvcBasics
{
    /// <summary>
    /// Custom Modelbinder für DateTime? - Wird definiert in der Global.asax, da wird der Typ angegeben wie "DateTime?"
    /// und wird dann auch nur für Nullable Datetime aufgerufen.
    /// </summary>
    public class DateTimeModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            //Da es sich um einen Nullable Type handelt, kann es sein das das Property nicht mit übergeben wurde.
            var raw = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            //Prüfen ob das Property überhaupt gesetzt wurde.
            if (raw != null)
            {
               var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;

               if (String.IsNullOrEmpty(date))
               {
                   return null;
               }

               bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));
               try
               {
                   //Da die Date Parse Methode von .net zu langsam ist und wir wissen wie Unser Datum aussieht was übergeben wird, können wir direkt versuchen das Datum zu parsen.
                   //WebConstants.InputDateTimeFormat ist das Format enthalten nach dem wir "parsen"
                   string[] dateArray = date.Split('.');
                   if (dateArray.Length == 3)
                   {
                       //Direktes erstellen eines neuen Datums im richtigen Format.
                       return new DateTime(int.Parse(dateArray[2]), int.Parse(dateArray[1]), int.Parse(dateArray[0]));
                   }

                   //Sonst einfach versuchen das Datum zu parsen
                   return DateTime.Parse(date);
               }
               catch (Exception)
               {
                   bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));
                   return null;
               }
            }

            return null;
        }
    }
}